/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package constructiva;

import java.util.ArrayList;

/**
 *
 * @author Colino
 */
public class Constructiva 
{
        public int cantOperaciones;
        public int ContructivaAlgo(dgbi.BiGrafo Bigraf)
        {
            cantOperaciones = 0;
            Bigraf.cantidadCruces();
            cantOperaciones = Bigraf.cantOpertaciones;
            cantOperaciones++;
            int crucesASumar = 0;
            cantOperaciones++;
            int posFinal = 0;
            cantOperaciones++;
            dgbi.Node n;
            cantOperaciones++;
            for(int j = 0; j < Bigraf.iv1.size();)
            {
                cantOperaciones++;
                posFinal = 0;
                cantOperaciones++;
                n = Bigraf.iv1.get(j);
                cantOperaciones++;
                Bigraf.v1.add(0,n);
                cantOperaciones++;
                Bigraf.iv1.remove(0);
                Bigraf.cantOpertaciones = 0;
                Bigraf.contruyeArreglosDePosiciones();
                cantOperaciones+= Bigraf.cantOpertaciones;
                crucesASumar = Bigraf.CortesDeV1(0);
                cantOperaciones+= Bigraf.cantOpertaciones;
                cantOperaciones++;
                int crucesASumar2 = 0;
                cantOperaciones++;
                for(int i =1; i<Bigraf.v1.size();i++)
                {
                    cantOperaciones++;
                    Bigraf.v1.remove(i-1);
                    cantOperaciones++;
                    Bigraf.v1.add(i,n);
                    cantOperaciones++;
                    Bigraf.cantOpertaciones= 0;
                    Bigraf.contruyeArreglosDePosiciones();
                    cantOperaciones += Bigraf.cantOpertaciones;
                    crucesASumar2 = Bigraf.CortesDeV1(i);
                    cantOperaciones += Bigraf.cantOpertaciones;
                    cantOperaciones++;
                    if(crucesASumar2 < crucesASumar)
                    {
                        cantOperaciones++;
                        crucesASumar =crucesASumar2;
                        cantOperaciones++;
                        posFinal = i;
                    }
                    cantOperaciones++;
                }
                cantOperaciones++;
                Bigraf.v1.remove(Bigraf.v1.size()-1);
                cantOperaciones++;
                Bigraf.v1.add(posFinal,n);
                cantOperaciones++;
                Bigraf.cantOpertaciones= 0;
                Bigraf.contruyeArreglosDePosiciones();
                cantOperaciones += Bigraf.cantOpertaciones;
                cantOperaciones++;
                Bigraf.cruces += crucesASumar;
                cantOperaciones++;
            }
            for(int j = 0; j < Bigraf.iv2.size();)
            {
                cantOperaciones++;
                posFinal = 0;
                cantOperaciones++;
                n = Bigraf.iv2.get(j);
                cantOperaciones++;
                Bigraf.v2.add(0,n);
                cantOperaciones++;
                Bigraf.iv2.remove(0);
                cantOperaciones++;
                Bigraf.cantOpertaciones= 0;
                Bigraf.contruyeArreglosDePosiciones();
                cantOperaciones += Bigraf.cantOpertaciones;
                crucesASumar = Bigraf.CortesDeV2(0);
                cantOperaciones += Bigraf.cantOpertaciones;
                cantOperaciones++;
                int crucesASumar2 = 0;
                cantOperaciones++;
                for(int i =1; i<Bigraf.v2.size();i++)
                {
                    cantOperaciones++;
                    Bigraf.v2.remove(i-1);
                    cantOperaciones++;
                    Bigraf.v2.add(i,n);
                    cantOperaciones++;
                    Bigraf.cantOpertaciones= 0;
                    Bigraf.contruyeArreglosDePosiciones();
                    cantOperaciones += Bigraf.cantOpertaciones;
                    crucesASumar2 = Bigraf.CortesDeV2(i);
                    cantOperaciones += Bigraf.cantOpertaciones;
                    cantOperaciones++;
                    if(crucesASumar2 < crucesASumar)
                    {
                        cantOperaciones++;
                        crucesASumar =crucesASumar2;
                        cantOperaciones++;
                        posFinal = i;
                    }
                    cantOperaciones++;
                }
                cantOperaciones++;
                Bigraf.v2.remove(Bigraf.v2.size()-1);
                cantOperaciones++;
                Bigraf.v2.add(posFinal,n);
                cantOperaciones++;
                Bigraf.cantOpertaciones= 0;
                Bigraf.contruyeArreglosDePosiciones();
                cantOperaciones += Bigraf.cantOpertaciones;
                cantOperaciones++;
                Bigraf.cruces += crucesASumar;
                cantOperaciones++;
            }
            cantOperaciones++;
            return Bigraf.cruces;
        }
        
        private ArrayList<Integer> ArregloPosiciones(int Longitud, int Porcent)
        {
                        cantOperaciones ++;
            ArrayList<Integer> array = new ArrayList<Integer>();
            cantOperaciones ++;
            Integer temp;
            cantOperaciones ++;
            for(int i = 0; i < Longitud; i++ )
            {
                cantOperaciones ++;
                temp = (Integer)i;
                cantOperaciones ++;
                array.add(temp);
                cantOperaciones ++;
            }
            cantOperaciones ++;
            int cantPosiciones = (Longitud*(100-Porcent))/100;
            cantOperaciones ++;
            for(int i = 0;i < cantPosiciones ; i++)
            {
                cantOperaciones ++;
                int azar = (int)((Math.random()*100)%array.size());
                cantOperaciones ++;
                array.remove(azar);
                cantOperaciones ++;
            }
            cantOperaciones ++;
            return array;
        }
        
        public int ContructivaAlgoGrasp(dgbi.BiGrafo Bigraf, int Porcent)
        {
            cantOperaciones ++;
            ArrayList<Integer> array = ArregloPosiciones(Bigraf.v1.size(), Porcent);
            cantOperaciones ++;
            Bigraf.cantOpertaciones = 0;
            Bigraf.cantidadCruces();
            cantOperaciones +=Bigraf.cantOpertaciones;
            cantOperaciones ++;
            boolean b = true;
            cantOperaciones ++;
            int crucesASumar = 0;
            cantOperaciones ++;
            int posFinal = 0;
            cantOperaciones ++;
            dgbi.Node n;
            cantOperaciones ++;
            for(int j = 0; j < Bigraf.iv1.size();)
            {
                cantOperaciones ++;
                posFinal = 0;
                cantOperaciones ++;
                n = Bigraf.iv1.get(j);
                cantOperaciones ++;
                Bigraf.v1.add(array.get(0).intValue(),n);
                cantOperaciones ++;
                Bigraf.iv1.remove(0);
                cantOperaciones ++;
                Bigraf.contruyeArreglosDePosiciones();
                cantOperaciones += Bigraf.cantOpertaciones;
                cantOperaciones ++;
                crucesASumar = Bigraf.CortesDeV1(array.get(0).intValue());
                cantOperaciones += Bigraf.cantOpertaciones;
                cantOperaciones ++;
                int crucesASumar2 = 0;
                cantOperaciones ++;
                array = ArregloPosiciones(Bigraf.v1.size(), Porcent);
                cantOperaciones ++;
                for(int i = 1 ; i < array.size();i++)
                {
                    cantOperaciones ++;
                    Bigraf.v1.remove(array.get(i-1).intValue());
                    cantOperaciones ++;
                    Bigraf.v1.add(array.get(i).intValue(),n);
                    cantOperaciones ++;
                    Bigraf.contruyeArreglosDePosiciones();
                    cantOperaciones += Bigraf.cantOpertaciones;
                    cantOperaciones ++;
                    crucesASumar2 = Bigraf.CortesDeV1(array.get(i).intValue());
                    cantOperaciones += Bigraf.cantOpertaciones;
                    cantOperaciones ++;
                    if(crucesASumar2 < crucesASumar)
                    {
                        cantOperaciones ++;
                        crucesASumar =crucesASumar2;
                        cantOperaciones ++;
                        posFinal = array.get(i).intValue();
                    }
                    cantOperaciones ++;
                }
                cantOperaciones ++;
                Bigraf.v1.remove(array.get(array.size()-1).intValue());
                cantOperaciones ++;
                Bigraf.v1.add(posFinal,n);
                cantOperaciones ++;
                Bigraf.contruyeArreglosDePosiciones();
                cantOperaciones += Bigraf.cantOpertaciones;
                Bigraf.cruces += crucesASumar;
                cantOperaciones ++;
            }
            cantOperaciones ++;
            array = ArregloPosiciones(Bigraf.v2.size(), Porcent);
            cantOperaciones ++;
            for(int j = 0; j < Bigraf.iv2.size();)
            {
                cantOperaciones ++;
                posFinal = 0;
                cantOperaciones ++;
                n = Bigraf.iv2.get(j);
                cantOperaciones ++;
                Bigraf.v2.add(array.get(0).intValue(),n);
                cantOperaciones ++;
                Bigraf.iv2.remove(0);
                cantOperaciones ++;
                Bigraf.contruyeArreglosDePosiciones();
                cantOperaciones += Bigraf.cantOpertaciones;
                crucesASumar = Bigraf.CortesDeV2(array.get(0).intValue());
                cantOperaciones += Bigraf.cantOpertaciones;
                cantOperaciones ++;
                int crucesASumar2 = 0;
                cantOperaciones ++;
                array = ArregloPosiciones(Bigraf.v2.size(), Porcent);
                cantOperaciones ++;
                for(int i = 1 ; i < array.size();i++)
                {
                    cantOperaciones ++;
                    Bigraf.v2.remove(array.get(i-1).intValue());
                    cantOperaciones ++;
                    Bigraf.v2.add(array.get(i).intValue(),n);
                    cantOperaciones ++;
                    Bigraf.contruyeArreglosDePosiciones();
                    cantOperaciones += Bigraf.cantOpertaciones;
                    crucesASumar2 = Bigraf.CortesDeV2(array.get(i).intValue());
                    cantOperaciones += Bigraf.cantOpertaciones;
                    cantOperaciones ++;
                    if(crucesASumar2 < crucesASumar)
                    {
                        cantOperaciones ++;
                        crucesASumar =crucesASumar2;
                        cantOperaciones ++;
                        posFinal = array.get(i).intValue();
                    }
                    cantOperaciones ++;
                }
                cantOperaciones ++;
                Bigraf.v2.remove(array.get(array.size()-1).intValue());
                cantOperaciones ++;
                Bigraf.v2.add(posFinal,n);
                cantOperaciones ++;
                Bigraf.contruyeArreglosDePosiciones();
                cantOperaciones += Bigraf.cantOpertaciones;
                cantOperaciones ++;
                Bigraf.cruces += crucesASumar;
            }
            cantOperaciones ++;
            Bigraf.cantidadCruces();
            return Bigraf.cruces;
        }
}
